package com.naxiang.cn.naxiangstram;

import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import com.baidu.cloud.bdrtmpsession.BDRtmpSessionBasic;
import com.baidu.cloud.bdrtmpsession.OnSessionEventListener;
import com.baidu.cloud.gpuimage.ColorAdjustFilter;
import com.baidu.cloud.gpuimage.GPUImageSoftenBeautyFilter;
import com.baidu.cloud.gpuimage.basefilters.GPUImageFilter;
import com.naxiang.cn.config.LiveConfig;
import com.naxiang.cn.session.LiveStreamSession;

import java.util.ArrayList;
import java.util.List;


public class NaxiangVido extends AppCompatActivity implements View.OnClickListener, OnSessionEventListener {
    private LiveStreamSession mSession;
    private SurfaceView       mSurfaceView;
    private String                      mRoomName = "";
    private BDRtmpSessionBasic.UserRole mRole     = BDRtmpSessionBasic.UserRole.Host;
    private Button mSteartStream;
    private boolean isStart = true;
    private Button mOverStram;
    private GPUImageSoftenBeautyFilter beautyFilter;
    private ColorAdjustFilter colorAdjustFilter;
    private GPUImageFilter customFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_naxiang_vido);
        mSurfaceView= (SurfaceView) findViewById(R.id.local_preview);
        mSteartStream=(Button) findViewById(R.id.startstream);
        mOverStram=(Button) findViewById(R.id.overstream);
        mSteartStream.setOnClickListener(this);
        mOverStram.setOnClickListener(this);


        // 1-->主播  2-->高级观众 3-->普通观众
        mRole = getUserRoleByType(1);
        // 配置录制参数
        LiveConfig.Builder builder = new LiveConfig.Builder();
        builder.setVideoWidth(720)// 设置输出视频的宽（像素个数）
                .setVideoHeight(1280) // 设置输出视频的高（像素个数）
                .setCameraOrientation(0) // 设置相机旋转参数，通常横屏传0度，竖屏传90度
                .setVideoFPS(20) // 设置帧率
                .setInitVideoBitrate(400000)// 设置视频编码初始码率
                .setMinVideoBitrate(100000) // 设置视频编码最低码率（用于动态码率控制）
                .setMaxVideoBitrate(800000)// 设置视频编码最高码率（用于动态码率控制）
                .setVideoEnabled(true)
                .setAudioSampleRate(44100)
                .setAudioBitrate(64000)
                .setCameraOrientation(90)
                .setAudioEnabled(true)
                .setCameraId(Camera.CameraInfo.CAMERA_FACING_FRONT); // 设置所使用的相机


        // 初始化录制Session
        mSession = new LiveStreamSession(NaxiangVido.this, builder.build());

        //设置回调监听
        mSession.setRtmpEventListener(this);

        // 初始化录音与捕获视频的device. 在创建Session时仅调用一次；
        mSession.setupDevice();

        // 绑定SurfaceHolder
        mSession.setSurfaceHolder(mSurfaceView.getHolder());

        //设置地址等
        mSession.configRtmpSession("rtmp://push1.rocyblog.com:8935/test/",mRole);




        // 美颜滤镜
        beautyFilter = new GPUImageSoftenBeautyFilter();
        // 颜色调整滤镜
        colorAdjustFilter = new ColorAdjustFilter(NaxiangVido.this);
        // 其他滤镜：如风格滤镜，自定义滤镜
        customFilter = new GPUImageFilter();

        List<GPUImageFilter> filters = new ArrayList<>();

        filters.add(beautyFilter);
        filters.add(colorAdjustFilter);
        filters.add(customFilter);
        // 设置美颜、色彩调整、风格等滤镜链
        mSession.setGPUImageFilters(filters);

//        // 设置背景乐
//        mSession.configBackgroundMusic(boolean enableBGM, String bgmPath, boolean isLooping)
//        // 设置背景乐区间，单位为微妙（us）
//        mSession.configBackgroundMusicClip(long clipStartInUSec, long clipDurationInUSec)

//        // 设置录音音量增益，取值[0f, 1f]
//        mSession.setRecordTrackGain(float gain);
//        // 设置背景音音量增益，取值[0f, 1f]
//        mSession.setBGMTrackGain(float gain);


//        // 开启或关闭闪光灯
//        mSession.toggleFlash(boolean flag);
//        // 是否可以切换摄像头
//        mSession.canSwitchCamera();
//        // 切换摄像头
//        mSession.switchCamera(int cameraId);
//        // focus到具体位置
//        mSession.focusToPoint(int x, int y);
//        // 获取最大缩放因子
//        mSession.getMaxZoomFactor();
//        // 设置缩放因子
//        mSession.setZoomFactor(int factor);

        // 发起会话请求
        // 参数userStreamUrl为被叫的rtmp推流地址
        // 参数userId为被叫的业务ID
//        mSession.startCallWith(userStreamUrl, userId);


        // 结束（或取消）会话
        // 参数userStreamUrl为呼叫者（小主播）的rtmp推流地址
        // 参数userId为呼叫者（小主播）的业务ID
//        mSession.stopCallWith(userStreamUrl, userId);


        if (isStart){

            mSteartStream.setText("暂停直播");
        }
    }

    private BDRtmpSessionBasic.UserRole getUserRoleByType(int type) {
        switch (type) {
            case 1:
                return BDRtmpSessionBasic.UserRole.Host;
            case 2:
                return BDRtmpSessionBasic.UserRole.Guest;
            default:
                return BDRtmpSessionBasic.UserRole.Audience;
        }
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        if (id==R.id.startstream){
            isStart = !isStart;
            if (isStart) {
                // 开始推流
                mSteartStream.setText("重新开始直播");
                // 恢复推流
                mSession.resumeStreaming();
            }else {

                // 暂停推流
                mSteartStream.setText("暂停直播");
                mSession.pauseStreaming();

            }

        }else if (id==R.id.overstream){

            // 停止推流
            mSession.stopStreaming();

        }
    }

    //监听已经连接
    @Override
    public void onSessionConnected() {
        // 开始推流
        mSession.startStreaming();
        System.out.println("开始录制");

    }

    //监听连接错误
    @Override
    public void onError(int i) {
        System.out.println("录制错误");

    }

    //连麦请求监听
    @Override
    public void onConversationRequest(String callerUrl,String userId) {
//        if (requestMap.size() == 2 && !requestMap.containsKey(userId)) {
//            mSession.stopCallWith(callerUrl, userId);
//        }
//        requestMap.put(userId, callerUrl);
//        activity.runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
//                requesting.set(true);
//                callerAdapter.notifyDataSetChanged();
//            }
//        });
    }

    @Override
    public void onConversationStarted(String s) {

    }

    @Override
    public void onConversationFailed(String s, FailureReason failureReason) {

    }

    @Override
    public void onConversationEnded(String s) {

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 销毁，不再使用时调用
        mSession.destroyRtmpSession();
        mSession.releaseDevice();
    }

}
